/*
  Programa GEFE - Gestión de eventos lúdicos.
  Copyright (C) 2010  Antonio Ramírez Marti

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "reporteactividades.h"

#include <QTextCharFormat>
#include <QTextBlockFormat>
#include <QTextTable>
#include <QTextTableFormat>
#include <QTextTableCell>
#include <QTextTableCellFormat>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDate>

ReporteActividades::ReporteActividades(QObject *parent) :
    QObject(parent)
{
    setup();
}

QTextDocument *ReporteActividades::getReporte() const
{
    return this->reporte;
}

void ReporteActividades::setup()
{
    this->reporte=0;
    this->okImage=QImage(":/iconos/iconos/emblem-cool.png").scaled(20,20,Qt::KeepAspectRatio);
    this->delayImage=QImage(":/iconos/iconos/package-broken.png").scaled(20,20,Qt::KeepAspectRatio);
    this->cancelImage=QImage(":/iconos/iconos/monsterz.png").scaled(20,20,Qt::KeepAspectRatio);
}

void ReporteActividades::clean()
{
    if(this->reporte)
    {
        delete this->reporte;
        this->reporte=0;
    }

}

void ReporteActividades::reportePorTipos()
{
    clean();

    reporte=new QTextDocument(this);
    cursor=new QTextCursor(reporte);
    QTextCharFormat formatoCabeceraCelda,formatoCelda;
    QTextCharFormat formatoEncabezado;
    QFont fuenteCabecera("Arial",12,QFont::Bold,true);
    QFont fuenteCelda("Arial",12,QFont::Normal,false);
    QFont fuenteEncabezado("Arial",18,QFont::Bold,true);

    formatoCabeceraCelda.setFont(fuenteCabecera);
    formatoCelda.setFont(fuenteCelda);
    formatoEncabezado.setFont(fuenteEncabezado);
    formatoEncabezado.setUnderlineStyle(QTextCharFormat::SingleUnderline);

    //Datos generales del evento
    writeDatosGenerales();

    {
        QSqlQuery query(QSqlDatabase::database("evento"));
        QSqlQuery actividadesPorTipos(QSqlDatabase::database("evento"));

        query.exec("SELECT tipoAct,count(*) as numero from actividad group by tipoAct order by numero desc");
        actividadesPorTipos.prepare("select nombre,dia,horaInicio,horaFin,localizacion,estado from actividad where tipoAct=:tipo order by nombre asc;");

        cursor->insertTable(1,2);
        cursor->setCharFormat(formatoCabeceraCelda);
        cursor->insertText("Tipos de actividades");
        cursor->movePosition(QTextCursor::NextCell);
        cursor->setCharFormat(formatoCabeceraCelda);
        cursor->insertText("Numero de actividades");
        cursor->setCharFormat(formatoCelda);
        QTextTable *tabla=cursor->currentTable();

        while(query.next())
        {
            tabla->appendRows(1);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(0).toString());
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(1).toString());
        }

        cursor->movePosition(QTextCursor::End);
        cursor->insertBlock();
        cursor->insertBlock();

        query.first();

        do
        {
            actividadesPorTipos.bindValue(":tipo",query.value(0));
            actividadesPorTipos.exec();

            cursor->setCharFormat(formatoEncabezado);
            cursor->insertText(query.value(0).toString());
            cursor->insertBlock();
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertTable(1,6);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Nombre");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Dia");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Hora de inicio");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Hora de fin");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Lugar");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Estado");
            cursor->setCharFormat(formatoCelda);
            tabla=cursor->currentTable();
            while(actividadesPorTipos.next())
            {
                tabla->appendRows(1);
                cursor->movePosition(QTextCursor::PreviousRow);
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(0).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(1).toDate().toString("dddd, dd 'de' MMMM"));
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(2).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(3).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(4).toString());
                cursor->movePosition(QTextCursor::NextCell);
                switch(actividadesPorTipos.value(5).toInt())
                {
                case 0:
                    cursor->insertImage(this->okImage);
                    break;
                case 1:
                    cursor->insertImage(this->delayImage);
                    break;
                case 2:
                    cursor->insertImage(this->cancelImage);
                    break;
                default:
                    break;
                }
            }
            cursor->movePosition(QTextCursor::End);
            cursor->insertBlock();
            cursor->insertBlock();
        } while(query.next());

    }
    presentaDialog();

}

void ReporteActividades::reporteGeneral(Formato form)
{

}

void ReporteActividades::reportePorSalas()
{
    clean();

    reporte=new QTextDocument(this);
    cursor=new QTextCursor(reporte);
    QTextCharFormat formatoCabeceraCelda,formatoCelda;
    QTextCharFormat formatoEncabezado;
    QFont fuenteCabecera("Arial",12,QFont::Bold,true);
    QFont fuenteCelda("Arial",12,QFont::Normal,false);
    QFont fuenteEncabezado("Arial",18,QFont::Bold,true);

    formatoCabeceraCelda.setFont(fuenteCabecera);
    formatoCelda.setFont(fuenteCelda);
    formatoEncabezado.setFont(fuenteEncabezado);
    formatoEncabezado.setUnderlineStyle(QTextCharFormat::SingleUnderline);

    //Datos generales del evento
    writeDatosGenerales();

    {
        QSqlQuery query(QSqlDatabase::database("evento"));
        QSqlQuery actividadesPorTipos(QSqlDatabase::database("evento"));

        query.exec("select localizacion,count(*) as num from actividad group by localizacion order by num desc");
        actividadesPorTipos.prepare("select nombre,dia,horaInicio,horaFin,tipoAct,estado from actividad where localizacion=:sala order by dia asc ,horaInicio asc");

        cursor->insertTable(1,2);
        cursor->setCharFormat(formatoCabeceraCelda);
        cursor->insertText("Localizaciones");
        cursor->movePosition(QTextCursor::NextCell);
        cursor->setCharFormat(formatoCabeceraCelda);
        cursor->insertText("Numero de actividades");
        cursor->setCharFormat(formatoCelda);
        QTextTable *tabla=cursor->currentTable();

        while(query.next())
        {
            tabla->appendRows(1);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(0).toString());
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(1).toString());
        }

        cursor->movePosition(QTextCursor::End);
        cursor->insertBlock();
        cursor->insertBlock();

        query.first();

        do
        {
            actividadesPorTipos.bindValue(":tipo",query.value(0));
            actividadesPorTipos.exec();

            cursor->setCharFormat(formatoEncabezado);
            cursor->insertText(query.value(0).toString());
            cursor->insertBlock();
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertTable(1,6);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Nombre");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Dia");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Hora de inicio");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Hora de fin");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Tipo de actividad");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Estado");
            cursor->setCharFormat(formatoCelda);
            tabla=cursor->currentTable();
            while(actividadesPorTipos.next())
            {
                tabla->appendRows(1);
                cursor->movePosition(QTextCursor::PreviousRow);
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(0).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(1).toDate().toString("dddd, dd 'de' MMMM"));
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(2).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(3).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(4).toString());
                cursor->movePosition(QTextCursor::NextCell);
                switch(actividadesPorTipos.value(5).toInt())
                {
                case 0:
                    cursor->insertImage(this->okImage);
                    break;
                case 1:
                    cursor->insertImage(this->delayImage);
                    break;
                case 2:
                    cursor->insertImage(this->cancelImage);
                    break;
                default:
                    break;
                }
            }
            cursor->movePosition(QTextCursor::End);
            cursor->insertBlock();
            cursor->insertBlock();
        } while(query.next());

    }
    presentaDialog();

}

void ReporteActividades::reportePorDias()
{
    clean();

    reporte=new QTextDocument(this);
    cursor=new QTextCursor(reporte);
    QTextCharFormat formatoCabeceraCelda,formatoCelda;
    QTextCharFormat formatoEncabezado;
    QFont fuenteCabecera("Arial",12,QFont::Bold,true);
    QFont fuenteCelda("Arial",12,QFont::Normal,false);
    QFont fuenteEncabezado("Arial",18,QFont::Bold,true);

    formatoCabeceraCelda.setFont(fuenteCabecera);
    formatoCelda.setFont(fuenteCelda);
    formatoEncabezado.setFont(fuenteEncabezado);
    formatoEncabezado.setUnderlineStyle(QTextCharFormat::SingleUnderline);

    //Datos generales del evento
    writeDatosGenerales();

    {
        QSqlQuery query(QSqlDatabase::database("evento"));
        QSqlQuery actividadesPorTipos(QSqlDatabase::database("evento"));

        query.exec("select dia,count(*) as num from actividad group by dia order by dia asc");
        actividadesPorTipos.prepare("select nombre,horaInicio,horaFin,tipoAct,localizacion,estado from actividad where dia=:fecha order by horaInicio asc;");

        cursor->insertTable(1,2);
        cursor->setCharFormat(formatoCabeceraCelda);
        cursor->insertText("Dias");
        cursor->movePosition(QTextCursor::NextCell);
        cursor->setCharFormat(formatoCabeceraCelda);
        cursor->insertText("Numero de actividades");
        cursor->setCharFormat(formatoCelda);
        QTextTable *tabla=cursor->currentTable();

        while(query.next())
        {
            tabla->appendRows(1);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(0).toDate().toString("dddd, dd 'de' MMMM"));
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(1).toString());
        }

        cursor->movePosition(QTextCursor::End);
        cursor->insertBlock();
        cursor->insertBlock();

        query.first();

        do
        {
            actividadesPorTipos.bindValue(":fecha",query.value(0).toDate().toString("yyyy-MM-dd"));
            actividadesPorTipos.exec();

            cursor->setCharFormat(formatoEncabezado);
            cursor->insertText(query.value(0).toDate().toString("dddd, dd 'de' MMMM"));
            cursor->insertBlock();
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertTable(1,6);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Nombre");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Hora de inicio");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Hora de fin");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Tipo de actividad");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Localizacion");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Estado");
            cursor->setCharFormat(formatoCelda);
            tabla=cursor->currentTable();
            while(actividadesPorTipos.next())
            {
                tabla->appendRows(1);
                cursor->movePosition(QTextCursor::PreviousRow);
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(0).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(1).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(2).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(3).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(4).toString());
                cursor->movePosition(QTextCursor::NextCell);
                switch(actividadesPorTipos.value(5).toInt())
                {
                case 0:
                    cursor->insertImage(okImage);
                    break;
                case 1:
                    cursor->insertImage(delayImage);
                    break;
                case 2:
                    cursor->insertImage(cancelImage);
                    break;
                default:
                    break;
                }
            }
            cursor->movePosition(QTextCursor::End);
            cursor->insertBlock();
            cursor->insertBlock();
        } while(query.next());

    }
    presentaDialog();

}

void ReporteActividades::reportePorAsociaciones()
{
    clean();

    reporte=new QTextDocument(this);
    cursor=new QTextCursor(reporte);
    QTextCharFormat formatoCabeceraCelda,formatoCelda;
    QTextCharFormat formatoEncabezado;
    QFont fuenteCabecera("Arial",12,QFont::Bold,true);
    QFont fuenteCelda("Arial",12,QFont::Normal,false);
    QFont fuenteEncabezado("Arial",18,QFont::Bold,true);

    formatoCabeceraCelda.setFont(fuenteCabecera);
    formatoCelda.setFont(fuenteCelda);
    formatoEncabezado.setFont(fuenteEncabezado);
    formatoEncabezado.setUnderlineStyle(QTextCharFormat::SingleUnderline);

    //Datos generales del evento
    writeDatosGenerales();

    {
        QSqlQuery query(QSqlDatabase::database("evento"));
        QSqlQuery actividadesPorTipos(QSqlDatabase::database("evento"));

        query.exec("select asociacion,count(*) as num from actividad group by asociacion order by num desc");
        actividadesPorTipos.prepare("select nombre,dia,horaInicio,horaFin,tipoAct,localizacion,estado from actividad where asociacion=:aso order by horaInicio asc;");

        cursor->insertTable(1,2);
        cursor->setCharFormat(formatoCabeceraCelda);
        cursor->insertText("Asociaciones");
        cursor->movePosition(QTextCursor::NextCell);
        cursor->setCharFormat(formatoCabeceraCelda);
        cursor->insertText("Numero de actividades");
        cursor->setCharFormat(formatoCelda);
        QTextTable *tabla=cursor->currentTable();

        while(query.next())
        {
            tabla->appendRows(1);
            cursor->movePosition(QTextCursor::PreviousRow);
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(0).toString());
            cursor->movePosition(QTextCursor::NextCell);
            cursor->insertText(query.value(1).toString());
        }

        cursor->movePosition(QTextCursor::End);
        cursor->insertBlock();
        cursor->insertBlock();

        query.first();

        do
        {
            actividadesPorTipos.bindValue(":aso",query.value(0));
            actividadesPorTipos.exec();

            cursor->setCharFormat(formatoEncabezado);
            cursor->insertText(query.value(0).toString());
            cursor->insertBlock();
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertTable(1,7);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Nombre");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Dia");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Hora de inicio");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Hora de fin");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Tipo de actividad");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Localizacion");
            cursor->movePosition(QTextCursor::NextCell);
            cursor->setCharFormat(formatoCabeceraCelda);
            cursor->insertText("Estado");
            cursor->setCharFormat(formatoCelda);
            tabla=cursor->currentTable();
            while(actividadesPorTipos.next())
            {
                tabla->appendRows(1);
                cursor->movePosition(QTextCursor::PreviousRow);
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(0).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(1).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(2).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(3).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(4).toString());
                cursor->movePosition(QTextCursor::NextCell);
                cursor->insertText(actividadesPorTipos.value(5).toString());
                cursor->movePosition(QTextCursor::NextCell);
                switch(actividadesPorTipos.value(6).toInt())
                {
                case 0:
                    cursor->insertImage(okImage);
                    break;
                case 1:
                    cursor->insertImage(delayImage);
                    break;
                case 2:
                    cursor->insertImage(cancelImage);
                    break;
                default:
                    break;
                }
            }
            cursor->movePosition(QTextCursor::End);
            cursor->insertBlock();
            cursor->insertBlock();
        } while(query.next());

    }
    presentaDialog();

}

void ReporteActividades::presentaDialog()
{
    DialogReport *dialog=new DialogReport(0);

    dialog->setDocument(this->reporte);

    dialog->exec();

    delete dialog;
}

void ReporteActividades::writeDatosGenerales()
{
    QTextCharFormat formatoCabecera;
    QTextCharFormat formatoDatos;
    QFont fuenteCabecera("Arial",20,QFont::Bold,false);
    QString nombre,fechaInicio,fechaFin;

    fuenteCabecera.setCapitalization(QFont::Capitalize);

    formatoCabecera.setFont(fuenteCabecera);
    formatoDatos.setFont(fuenteCabecera);
    formatoDatos.setFontItalic(true);

    this->cursor->setCharFormat(formatoCabecera);

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT nombreEvento,inicio,fin FROM evento");

        query.first();
        nombre=query.value(0).toString();
        fechaInicio=query.value(1).toDate().toString("dddd, dd 'de' MMMM 'de' yyyy");
        fechaFin=query.value(2).toDate().toString("dddd, dd 'de' MMMM 'de' yyyy");

    }

    cursor->setCharFormat(formatoDatos);
    cursor->insertText(nombre+"\n\n");
    formatoCabecera.setFontPointSize(18);
    formatoDatos.setFontPointSize(16);
    cursor->setCharFormat(formatoDatos);
    cursor->insertText(fechaInicio+" al "+fechaFin+"\n\n");
}
